home *** CD-ROM | disk | FTP | other *** search
- /*
- Mean.c
- Quickly computes mean (and optionally the standard deviation) of an array of samples.
- The loops do only one memory access per iteration.
-
- HISTORY:
- 9/16/90 dgp wrote it.
- 1/10/94 dgp added MeanC and MeanUC that operate on arrays of signed char and
- unsigned char.
- Optimized to minimize memory accesses when compiled by THINK C 6.01.
- */
- #include "VideoToolbox.h"
- #include <math.h>
-
- #if 0
- double Mean(double x[],long n,double *sdPtr)
- // Original version, not optimized.
- {
- register double s,mean,xx;
- register long i;
-
- s=0.0;
- for(i=0;i<n;i++) s+=x[i];
- mean=s/n;
- if(sdPtr!=NULL){
- s=0.0;
- for(i=0;i<n;i++){
- xx=x[i];
- s+=xx*xx;
- }
- *sdPtr=sqrt((s-n*mean*mean)/(n-1));
- }
- return mean;
- }
- #else
- double Mean(double x[],long n,double *sdPtr)
- // x[] is double
- // Optimized to minimize memory accesses when compiled by THINK C 6.01
- {
- register double s;
- register long i;
- double *p;
-
- p=x;
- if(sdPtr!=NULL){
- register double ss;
- register double xx;
-
- s=ss=0.0;
- for(i=n;i>0;i--){
- s+=xx=*p++;
- ss+=xx*xx;
- }
- s/=n;
- *sdPtr=sqrt((ss-n*s*s)/(n-1));
- }else{
- s=0.0;
- for(i=n;i>0;i--) s+=*p++;
- s/=n;
- }
- return s;
- }
- #endif
-
- double MeanC(char x[],long n,double *sdPtr);
-
- double MeanC(char x[],long n,double *sdPtr)
- // x[] is char
- // Optimized to minimize memory accesses when compiled by THINK C 6.01
- {
- register double s;
- register long i;
- register char *p;
-
- p=x;
- if(sdPtr!=NULL){
- register double ss;
- register long xx;
-
- s=ss=0.0;
- for(i=n;i>0;i--){
- s+=xx=*p++;
- ss+=xx*xx;
- }
- s/=n;
- *sdPtr=sqrt((ss-n*s*s)/(n-1));
- }else{
- s=0.0;
- for(i=n;i>0;i--) s+=*p++;
- s/=n;
- }
- return s;
- }
-
- double MeanUC(unsigned char x[],long n,double *sdPtr);
-
- double MeanUC(unsigned char x[],long n,double *sdPtr)
- // x[] is unsigned char
- // Optimized to minimize memory accesses when compiled by THINK C 6.01
- {
- register double s;
- register long i;
- register unsigned char *p;
-
- p=x;
- if(sdPtr!=NULL){
- register double ss;
- register long xx;
-
- s=ss=0.0;
- for(i=n;i>0;i--){
- s+=xx=*p++;
- ss+=xx*xx;
- }
- s/=n;
- *sdPtr=sqrt((ss-n*s*s)/(n-1));
- }else{
- s=0.0;
- for(i=n;i>0;i--) s+=*p++;
- s/=n;
- }
- return s;
- }
-